#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <queue>
using namespace std;

//class Solution {
//public:
//    int longestPalindrome(string s) {
//        unordered_map<char, int> hash;
//        for (auto& e : s) hash[e]++;
//        int ret = 0;
//        bool flag = false;
//        for (auto& [x, y] : hash)
//        {
//            if (y >= 2)
//            {
//                if (y % 2 == 0) ret += y;
//                if (flag && y % 2 != 0)
//                {
//                    ret += (y - 1);
//                }
//                if (!flag && y % 2 != 0)
//                {
//                    ret += y;
//                    flag = true;
//                }
//            }
//            if (!flag && y == 1)
//            {
//                ret++;
//                flag = true;
//            }
//        }
//        return ret;
//    }
//};
//int main()
//{
//    Solution s;
//    string str = "abccccdd";
//    int k = s.longestPalindrome(str);
//    cout << k;
//    return 0;
//}
//

int main()
{
	unordered_map<int, vector<int>> hash;
	hash[1].push_back(2);
	int t = hash[1][2];
	return 0;
}

class Solution {
public:
    vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {
        if (n == 1) return { 0 };
        if (n == 2) return { 0, 1 };
        unordered_map<int, int> in;
        unordered_map<int, vector<int>> edge;
        for (int i = 0; i < edges.size(); i++)
        {
            in[edges[i][0]]++;
            in[edges[i][1]]++;
            edge[edges[i][1]].push_back(edges[i][0]);
            edge[edges[i][0]].push_back(edges[i][1]);
        }
        //
        queue<int> q;
        for (int i = 0; i < n; i++)
        {
            if (in[i] == 1) q.push(i);
        }
        //
        while (n > 2)
        {
            int k = q.size();
            while (k--)
            {
                int t = q.front();
                q.pop();
                n--;
                for (int i = 0; i < edge[t].size(); i++)
                {
                    in[edge[t][i]]--;
                    if (in[edge[t][i]] == 1)
                    {
                        q.push(edge[t][i]);
                    }
                }
            }
        }
        //
        vector<int> ret;
        while (!q.empty())
        {
            ret.push_back(q.front());
            q.pop();
        }
        return ret;
    }
};